/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package practica1;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import javax.swing.JOptionPane;

/**
 *
 * @author Mydelin
 */
public class MyLista implements List<EstudianteIngenieria> {

    EstudianteIngenieria Apuntador = null;

    
    
    @Override
    public int size() {
        int tamanio = 0;
          System.out.println("........LA LISTA ESTA VACIA......." );
        if (Apuntador != null) {
            EstudianteIngenieria temporal = Apuntador;
            tamanio++;
            
            //Poner el puntero desde el  principio
            while (temporal.punteroanterior != null) {
                temporal = temporal.punteroanterior;
            }
            
            //empzar a contar dsde q el puntero sta en cero hasta el final de la lista
            while (temporal.punterosiguiente != null) {
                
                temporal = temporal.punterosiguiente;
                tamanio++;
            }
            return tamanio;
        } else {
            return tamanio;
        }
    }

    @Override
    public boolean isEmpty() {
      return this.Apuntador==null;
    }

    @Override
    public boolean contains(Object o) {
        boolean existe=false;
            EstudianteIngenieria temporal = Apuntador;
        if(temporal!=null){
            while (temporal.punteroanterior != null) {
                temporal = temporal.punteroanterior;
                
            }
        }
            while(temporal!=null){
            if(o.equals(temporal)){
            existe=true;
            }
            temporal=temporal.punterosiguiente;
            }
        
return existe;
    }

    @Override
    public Iterator<EstudianteIngenieria> iterator() {
     MyIterador iterador = new MyIterador(this);
     return iterador;
     
    }

    @Override
    public Object[] toArray() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public <T> T[] toArray(T[] a) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean add(EstudianteIngenieria nuevo) {
          
        boolean insertado = false;
        if (this.Apuntador == null) {
            this.Apuntador = nuevo;
            insertado = true;
        } else {
            //falta lo mas facil hahaha ;)
            boolean repetido = false;
            while (!insertado) {
                
                
               

                if (this.Apuntador.carnet == nuevo.carnet) {
                    repetido = true;
                    insertado = true;
                } else {
                    if (this.Apuntador.carnet < nuevo.carnet) {

                        if (this.Apuntador.punterosiguiente != null) {
                            if (this.Apuntador.punterosiguiente.carnet > nuevo.carnet) {
                                this.Apuntador.punterosiguiente.punteroanterior = nuevo;
                                nuevo.punterosiguiente = this.Apuntador.punterosiguiente;
                                nuevo.punteroanterior = Apuntador;
                                Apuntador.punterosiguiente = nuevo;
                                insertado = true;
                            } else {
                                this.Apuntador = this.Apuntador.punterosiguiente;
                            }
                        } else {
                            this.Apuntador.punterosiguiente = nuevo;
                            nuevo.punteroanterior = this.Apuntador;
                             insertado = true;
                        }
                    }
                    if (this.Apuntador.carnet > nuevo.carnet) {
                          if (this.Apuntador.punteroanterior != null) {
                            if (this.Apuntador.punteroanterior.carnet < nuevo.carnet) {
                                this.Apuntador.punteroanterior.punterosiguiente = nuevo;
                                nuevo.punteroanterior = this.Apuntador.punteroanterior;
                                nuevo.punterosiguiente = Apuntador;
                                Apuntador.punteroanterior = nuevo;
                                insertado = true;
                            } else {
                                this.Apuntador = this.Apuntador.punteroanterior;
                            }
                        } else {
                            this.Apuntador.punteroanterior = nuevo;
                            nuevo.punterosiguiente = this.Apuntador;
                             insertado = true;
                        }
                    }

                }

            }
            
            
        }
        return insertado;
    }

    @Override
    public boolean remove(Object o) {
        boolean removido=false;
            EstudianteIngenieria temporal = Apuntador;
        if(temporal!=null){
            while (temporal.punteroanterior != null) {
                temporal = temporal.punteroanterior;
                
            }
        }
            while(temporal!=null && !removido){
            if(o.equals(temporal)){
                if(temporal.punterosiguiente!=null){
                    if(temporal.punteroanterior!=null){
                    temporal.punteroanterior.punterosiguiente=temporal.punterosiguiente;
                    temporal.punterosiguiente.punteroanterior=temporal.punteroanterior;
                    this.Apuntador=temporal.punterosiguiente;
                    removido=true;
                    }
                    else{
                    temporal.punterosiguiente.punteroanterior=null;
                    this.Apuntador=temporal.punterosiguiente;
                    removido=true;
                    }
                }
                else{
                if(temporal.punteroanterior!=null){
                temporal.punteroanterior.punterosiguiente=null;
                this.Apuntador=temporal.punteroanterior;
                removido=true;
                }else{
                this.Apuntador=null;
                    removido=true;
                }    
                }
            }
            temporal=temporal.punterosiguiente;
            }
        
return removido;
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean addAll(Collection<? extends EstudianteIngenieria> c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean addAll(int index, Collection<? extends EstudianteIngenieria> c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        boolean removido = false;
        
        if(Apuntador!=null){
            Apuntador=null;
            removido = true;
        }
        
        return removido;
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void clear() {
        this.Apuntador=null;
    }

    @Override
    public EstudianteIngenieria get(int index) {
         EstudianteIngenieria existe =null;
            EstudianteIngenieria temporal = Apuntador;
        
            if(temporal!=null){
            while (temporal.punteroanterior != null) {
                temporal = temporal.punteroanterior;
            }
            }
            while(temporal!=null){
            if(temporal.carnet==index){
            existe=temporal;
            }
            temporal=temporal.punterosiguiente;
            }
        
return existe;
    }

    @Override
    public EstudianteIngenieria set(int index, EstudianteIngenieria element) {
        EstudianteIngenieria EXISTENTE=null;
        boolean insertado = false;
        if (this.Apuntador == null) {
            this.Apuntador = element;
            insertado = true;
        } else {
            //falta lo mas facil hahaha ;)
            
            while (!insertado) {

                if (this.Apuntador.carnet == element.carnet) {
                    EXISTENTE=this.Apuntador;
                    element.punteroanterior=this.Apuntador.punteroanterior;
                    element.punterosiguiente=this.Apuntador.punterosiguiente;
                    
                    if(this.Apuntador.punteroanterior!=null){
                    this.Apuntador.punteroanterior.punterosiguiente=element;
                    }
                    if(this.Apuntador.punterosiguiente!=null){
                    this.Apuntador.punterosiguiente.punteroanterior=element;
                    }
                    insertado = true;
                } else {
                    if (this.Apuntador.carnet < element.carnet) {

                        if (this.Apuntador.punterosiguiente != null) {
                            if (this.Apuntador.punterosiguiente.carnet > element.carnet) {
                                this.Apuntador.punterosiguiente.punteroanterior = element;
                                element.punterosiguiente = this.Apuntador.punterosiguiente;
                                element.punteroanterior = Apuntador;
                                Apuntador.punterosiguiente = element;
                                insertado = true;
                            } else {
                                this.Apuntador = this.Apuntador.punterosiguiente;
                            }
                        } else {
                            this.Apuntador.punterosiguiente = element;
                            element.punteroanterior = this.Apuntador;
                             insertado = true;
                        }
                    }
                    if (this.Apuntador.carnet > element.carnet) {
                          if (this.Apuntador.punteroanterior != null) {
                            if (this.Apuntador.punteroanterior.carnet < element.carnet) {
                                this.Apuntador.punteroanterior.punterosiguiente = element;
                                element.punteroanterior = this.Apuntador.punteroanterior;
                                element.punterosiguiente = Apuntador;
                                Apuntador.punteroanterior = element;
                                insertado = true;
                            } else {
                                this.Apuntador = this.Apuntador.punteroanterior;
                            }
                        } else {
                            this.Apuntador.punteroanterior = element;
                            element.punterosiguiente = this.Apuntador;
                             insertado = true;
                        }
                    }

                }

            }
            
            
        }
     return EXISTENTE;   
    }

    @Override
    public void add(int index, EstudianteIngenieria element) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public EstudianteIngenieria remove(int index) {
     EstudianteIngenieria elementoRemovido=null;
     boolean removido=false;
     
            EstudianteIngenieria temporal = Apuntador;
        if(temporal!=null){
            while (temporal.punteroanterior != null) {
                temporal = temporal.punteroanterior;
                
            }
        }
            while(temporal!=null && !removido){
            if(index==temporal.carnet){
                if(temporal.punterosiguiente!=null){
                    if(temporal.punteroanterior!=null){
                        elementoRemovido=temporal;
                    temporal.punteroanterior.punterosiguiente=temporal.punterosiguiente;
                    temporal.punterosiguiente.punteroanterior=temporal.punteroanterior;
                    this.Apuntador=temporal.punterosiguiente;
                    removido=true;
                    }
                    else{
                        elementoRemovido=temporal;
                    temporal.punterosiguiente.punteroanterior=null;
                    this.Apuntador=temporal.punterosiguiente;
                    removido=true;
                    }
                }
                else{
                if(temporal.punteroanterior!=null){
                    elementoRemovido=temporal;
                temporal.punteroanterior.punterosiguiente=null;
                this.Apuntador=temporal.punteroanterior;
                removido=true;
                }else{
                    elementoRemovido=this.Apuntador;
                this.Apuntador=null;
                    removido=true;
                }    
                }
            }
            temporal=temporal.punterosiguiente;
            }
        
return elementoRemovido;
    }

    @Override
    public int indexOf(Object o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int lastIndexOf(Object o) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public ListIterator<EstudianteIngenieria> listIterator() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public ListIterator<EstudianteIngenieria> listIterator(int index) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<EstudianteIngenieria> subList(int fromIndex, int toIndex) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}
